談測試之前,我們必須先知道,撰寫可修改的程式碼實踐依賴於三項不同的技能:
必須瞭解物件導向設計
了解如何設計良好的對象和類結構是至關重要的。合理的設計可以最小化代碼修改的成本,使代碼易於維護和擴展。
必須熟練於程式碼重構
代碼重構是一種改進代碼內部結構的過程,而不改變其外部行為。通過小而確切的步驟來調整代碼,逐步將一種設計轉變為另一種設計。
良好的設計應該能夠以最小的代價保留最大的靈活性,延遲設計決策,並將承諾推遲到有更具體的需求時。
撰寫高價值測試的能力
編寫有效的測試是非常重要的,因為它們可以為重構提供信心。有效的測試可以證明修改後的代碼仍然能夠正確執行,而不會增加整體成本。好的測試應該能夠經受住代碼重構的考驗,它們不會因代碼修改而需要重寫,並且為該功能背書,確保重構的正確性並且不會損壞功能。
設計良好的程式碼必須易於修改,重構時是將一種設計修改為另一種,而測試則可以讓你在重構時確保功能不會損壞。
為什麼我們需要寫測試?測試最常見的觀點包括:
如同設計的真正目的,測試的真正目的是要降低成本。大原則是如果撰寫、維護和執行測試所消耗的時間,比修復錯誤、撰寫文件和設計應用程式所需要的時間還要多,那麼很顯然這些測試並不值得撰寫。
1. 找出錯誤
在開發過程中,盡早找出錯誤或缺陷能讓將來的設計選項更有彈性,調整上相對容易,此外,隨著程式碼的累積,嵌入的錯誤會產生依賴。如果在後期才修復這些錯誤,可能需要大量修改依賴程式碼,盡早修復錯誤總是能降低成本。
2. 提供文件
當程式碼有許多人共同開發,或是已經經過好幾手開發人員時,測試文件提供了程式碼行為的文件,使其他開發人員能夠理解代碼的預期行為。
3. 延後設計決定
4. 支持抽象
5. 暴露出設計缺陷
如果編寫一個測試需要復雜的設置,那麼這意味著代碼對上下文的依賴過於復雜;如果測試一個對象需要涉及到許多其他對象,那麼這表示代碼具有大量的依賴關係;當設計很糟糕時,測試會難以編寫,其他開發人員也可能發現這段代碼難以重用。
測試雖然可以幫助暴露底層代碼的設計問題,但需要確保測試本身也具有良好的設計。最佳實踐是為重要的部分編寫鬆散耦合的測試,以最低的成本獲得測試的好處。
優先撰寫測試可以迫使少量的可重複使用性從一開始就被建構在物件,不過,優先撰寫測試既不能取代也不能保證一支設計良好的應用程式。對於新手設計師來說,保持對測試價值的信心很重要。在正確的時間,採取正確的數量,測試並撰寫測試優先的程式碼,將會是我們的首要課題。
何種測試風格?
測試驅動開發 (Test Driven Development, 簡稱為 TDD ):
由內向外的方式,它通常是從領域物件開始測試,然後在程式碼鄰接層的測試裡重複使用這些新建立的領域物件。
行為驅動開發(Behavior Driven Development, 簡稱爲BDD ):
由外向内的方式,它會在應用程式的邊界上建立物件,並向內深入,必要時還會偽裝成尚未撰寫的物件。
應用程式的物件劃分
應當假設應用程式的其餘部分是被掩蓋的,因此在測試期間唯一的可用資訊只會來自於受測物件。
參考資料